package main

import "fmt"

type Human struct {
	name string
}

func (human *Human) speak() {
	fmt.Println("我的名字是:", human.name)
}

// Student 组合Human，接近达到让Student拥有speak的能力
type Student struct {
	human Human
}

func (student *Student) study() {
	fmt.Println("好好许欸")
}

// StudentImpl 只保留了类型，忽略了名称
type StudentImpl struct {
	school string
	Human
}

func (student *StudentImpl) study() {
	fmt.Println("好好学习")
}

func main() {
	human := Human{
		name: "熊熊",
	}
	//student := Student{
	//	human: human,
	//}
	//student.human.speak()
	//student.study()

	//此时会按照顺序进行匹配，human会赋值给第一个字段Human
	stu := StudentImpl{
		//按顺序匹配字段，如果不写“小学”，则human会赋给school字段，会直接报错。
		"小学",
		human,
	}
	stu.speak()
	//%+v可以打印出变量详细细节
	//{{熊熊}},{Human:{name:熊熊}}
	//此时展示的匿名字段实际名称为Human，与数据类型本身的名称一致
	fmt.Printf("%v,%+v", stu, stu)
}
